//
// Created by Leaf on 2025/8/19.
//

#include "ultrasonic.h"

// 超声波传感器类构造函数（单引脚模式）
Ultrasonic::Ultrasonic(uint8_t signalPin) : trig_pin(signalPin), echo_pin(signalPin) {
}

// 超声波传感器类构造函数（双引脚模式）
Ultrasonic::Ultrasonic(uint8_t trigPin, uint8_t echoPin) : trig_pin(trigPin), echo_pin(echoPin) {
}

// 初始化超声波传感器
void Ultrasonic::begin() {
    pinMode(trig_pin, OUTPUT);
    if (!isSinglePinMode()) {
        // 双引脚模式
        pinMode(echo_pin, INPUT);
    }
    
    // 初始化引脚状态
    digitalWrite(trig_pin, LOW);
}

// 获取距离值(cm)
float Ultrasonic::getDistance() const {
    if (isSinglePinMode()) {
        // 单引脚模式 (适用于Grove超声波传感器)
        pinMode(trig_pin, OUTPUT);
        digitalWrite(trig_pin, LOW);
        delayMicroseconds(2);
        digitalWrite(trig_pin, HIGH);
        delayMicroseconds(5);
        digitalWrite(trig_pin, LOW);
        pinMode(trig_pin, INPUT);
        long duration = pulseIn(trig_pin, HIGH, 30000); // 设置超时时间为30ms
        
        // 计算距离（cm）
        // 声速为340m/s，即0.034cm/us
        // 距离 = 时间 * 速度 / 2 （除以2是因为超声波需要往返）
        float distance = duration * 0.034 / 2;
        
        return distance;
    } else {
        // 双引脚模式 (适用于传统超声波传感器)
        digitalWrite(trig_pin, LOW);
        delayMicroseconds(2);
        digitalWrite(trig_pin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig_pin, LOW);
        
        // 读取回响信号
        long duration = pulseIn(echo_pin, HIGH, 30000); // 设置超时时间为30ms
        
        // 计算距离（cm）
        // 声速为340m/s，即0.034cm/us
        // 距离 = 时间 * 速度 / 2 （除以2是因为超声波需要往返）
        float distance = duration * 0.034 / 2;
        
        return distance;
    }
}

// 检查传感器是否正常工作
bool Ultrasonic::isWorking() const {
    float distance = getDistance();
    // 通常超声波传感器的有效测量范围是2cm-400cm
    return (distance >= 2.0 && distance <= 400.0);
}

// 判断是否为单引脚模式
bool Ultrasonic::isSinglePinMode() const {
    return (trig_pin == echo_pin);
}